<?php

namespace app\common;

/***
 * Class Password
 * @package app\common
 * @Author Vee7
 * @Date 2021/12/16
 * @Time 15:43
 * @Description 密码相关方法门面
 */
class Password
{
    /***
     * @return array
     * @Author Vee7
     * @Date 2021/12/16
     * @Time 15:45
     * @Description 加密规则方法,返回加密后密码和加密盐,该方法不可逆，无法解密，建议使用对比方法,可指定加密盐
     */
    public function EncryPass($str,$salt=null)
    {
        $return = [];
        if($salt === null){
            $return['salt'] = self::getRandomStr(6,true);
        }else{
            $return['salt'] = $salt;
        }
        $return['password'] = md5($return['salt'].$str);
        return $return;
    }

    /***
     * @param $str 要比较的字符串
     * @param $encry_str 已加密的字符串
     * @param $salt 加密字符串的加密盐
     * @return bool
     * @Author Vee7
     * @Date 2021/12/16
     * @Time 15:46
     * @Description 密码对比方法
     */
    public function ComparePass($str,$encry_str,$salt)
    {
        $newPass = self::EncryPass($str,$salt);
        if($newPass['password'] === $encry_str){
            return true;
        }
        return false;
    }

    /**
     * 获得随机字符串
     * @param $len             需要的长度
     * @param $special        是否需要特殊符号
     * @return string       返回随机字符串
     */
    function getRandomStr($len=6, $special=true){
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );
        if($special){
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }
        $charsLen = count($chars) - 1;
        shuffle($chars);                            //打乱数组顺序
        $str = '';
        for($i=0; $i<$len; $i++){
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        return $str;
    }


}